home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 021-030 / amok22 / warnbootgen / warnbootgen.mod < prev    next >
Text File  |  1993-11-04  |  13KB  |  339 lines

  1. (*************************************************************
  2.  *
  3.  * :Program.    WarnBoot.mod
  4.  * :Author.     Holger Gzella
  5.  * :Address.    Freischöffenweg 12  D-4600 Dortmund 16
  6.  * :Phone.      (0231) 85 16 02
  7.  * :Date.       11/7/89  19:30:07
  8.  * :Copyright.  PD
  9.  * :Version.    v1.0
  10.  * :Language.   Modula-2
  11.  * :Translator. M2Amiga v3.2d
  12.  * :Contents.   Utility to install a virus-warn-bootblock
  13.  * :Remark.     This may be somewhat useful.
  14.  * :Remark.     Beware to overwrite special bootblock-loaders!
  15.  *
  16.  *************************************************************)
  17.  
  18. MODULE WarnBootGen;
  19.  
  20. FROM Arts        IMPORT Assert,TermProcedure;
  21. FROM SYSTEM      IMPORT ADR,ADDRESS,INLINE,LONGSET;
  22. FROM Exec        IMPORT MsgPortPtr,IOStdReqPtr,DoIO,IOStdReq,write,AllocMem,
  23.                         MemReqSet,MemReqs,OpenDevice,CloseDevice,FreeMem,GetMsg,
  24.                         ReplyMsg,WaitPort,update;
  25. FROM ExecSupport IMPORT CreatePort,DeletePort,CreateStdIO,DeleteStdIO;
  26. FROM Graphics    IMPORT jam1,Text,Move,SetAPen,RastPortPtr;
  27. FROM Intuition   IMPORT NewWindow,WindowPtr,OpenWindow,CloseWindow,WindowFlags,
  28.                         WindowFlagSet,IDCMPFlags,IDCMPFlagSet,IntuiText,Gadget,
  29.                         GadgetPtr,IntuiMessagePtr,Border,GadgetFlags,boolGadget,
  30.                         GadgetFlagSet,ActivationFlags,ActivationFlagSet,
  31.                         ScreenFlags,ScreenFlagSet;
  32. FROM Trackdisk   IMPORT motor;
  33.  
  34. TYPE CardPtr = POINTER TO CARDINAL;
  35.  
  36. VAR dport    : MsgPortPtr;
  37.     dreq     : IOStdReqPtr;
  38.     ok,i     : INTEGER;
  39.     buffer   : CardPtr;
  40.     WhichGad : GadgetPtr;
  41.     class    : IDCMPFlagSet;
  42.     WDaten,RD: NewWindow;
  43.     Fenster,R: WindowPtr;
  44.     Gadgets  : ARRAY[0..4] OF Gadget;
  45.     Texte    : ARRAY[0..4] OF IntuiText;
  46.     Rahmen,RB: Border;
  47.     xyFeld,RF: ARRAY[0..9] OF INTEGER;
  48.     Nachricht: IntuiMessagePtr;
  49.     rp       : RastPortPtr;
  50.  
  51. PROCEDURE CleanUp;
  52.   BEGIN
  53.     IF Fenster#NIL THEN CloseWindow(Fenster); END;
  54.     IF dreq#NIL THEN DeleteStdIO(dreq); END;
  55.     IF dport#NIL THEN DeletePort(dport); END;
  56.     IF buffer#NIL THEN FreeMem(buffer,1024); END
  57.   END CleanUp;
  58.  
  59. PROCEDURE SetUpStuff;
  60.   BEGIN
  61.     xyFeld[0]:=0; xyFeld[1]:=0; xyFeld[2]:=99; xyFeld[3]:=0; xyFeld[4]:=99;
  62.     xyFeld[5]:=11; xyFeld[6]:=0; xyFeld[7]:=11; xyFeld[8]:=0; xyFeld[9]:=0;
  63.  
  64.     RF[0]:=0; RF[1]:=0; RF[2]:=35; RF[3]:=0; RF[4]:=35; RF[5]:=11;
  65.     RF[6]:=0; RF[7]:=11; RF[8]:=0; RF[9]:=0;
  66.  
  67.     WITH Rahmen DO
  68.       leftEdge:=-1; topEdge:=-1; frontPen:=1; backPen:=0; drawMode:=jam1;
  69.       count:=5; xy:=ADR(xyFeld); nextBorder:=NIL;
  70.     END;
  71.  
  72.     WITH RB DO
  73.       leftEdge:=-1; topEdge:=-1; frontPen:=1; backPen:=0; drawMode:=jam1;
  74.       count:=5; xy:=ADR(RF); nextBorder:=NIL;
  75.     END;
  76.  
  77.     FOR i:=0 TO 4 DO
  78.       WITH Texte[i] DO
  79.         frontPen:=1; backPen:=0; drawMode:=jam1; leftEdge:=1; topEdge:=2;
  80.         nextText:=NIL; iTextFont:=NIL; iText:=NIL;
  81.       END;
  82.     END;
  83.     Texte[0].iText:=ADR("    INFO    "); Texte[1].iText:=ADR("Install DF0:");
  84.     Texte[2].iText:=ADR("Install DF1:"); Texte[3].iText:=ADR("    EXIT    ");
  85.     Texte[4].iText:=ADR(" OK ");
  86.  
  87.     WITH Gadgets[4] DO
  88.       nextGadget:=NIL; leftEdge:=143; topEdge:=135;
  89.       width:=34; height:=10; flags:=GadgetFlagSet{}; gadgetType:=boolGadget;
  90.       activation:=ActivationFlagSet{gadgImmediate,relVerify};
  91.       gadgetRender:=ADR(RB); selectRender:=NIL; gadgetText:=ADR(Texte[4]);
  92.       specialInfo:=NIL; gadgetID:=5; userData:=NIL;
  93.     END;
  94.  
  95.     WITH Gadgets[3] DO
  96.       nextGadget:=NIL; leftEdge:=334; topEdge:=20;
  97.       width:=98; height:=10; flags:=GadgetFlagSet{}; gadgetType:=boolGadget;
  98.       activation:=ActivationFlagSet{gadgImmediate,relVerify};
  99.       gadgetRender:=ADR(Rahmen); selectRender:=NIL; gadgetText:=ADR(Texte[3]);
  100.       specialInfo:=NIL; gadgetID:=4; userData:=NIL;
  101.     END;
  102.  
  103.     WITH Gadgets[2] DO
  104.       nextGadget:=ADR(Gadgets[3]); leftEdge:=226; topEdge:=20;
  105.       width:=98; height:=10; flags:=GadgetFlagSet{}; gadgetType:=boolGadget;
  106.       activation:=ActivationFlagSet{gadgImmediate,relVerify};
  107.       gadgetRender:=ADR(Rahmen); selectRender:=NIL; gadgetText:=ADR(Texte[2]);
  108.       specialInfo:=NIL; gadgetID:=3; userData:=NIL;
  109.     END;
  110.  
  111.     WITH Gadgets[1] DO
  112.       nextGadget:=ADR(Gadgets[2]); leftEdge:=118; topEdge:=20;
  113.       width:=98; height:=10; flags:=GadgetFlagSet{}; gadgetType:=boolGadget;
  114.       activation:=ActivationFlagSet{gadgImmediate,relVerify};
  115.       gadgetRender:=ADR(Rahmen); selectRender:=NIL; gadgetText:=ADR(Texte[1]);
  116.       specialInfo:=NIL; gadgetID:=2; userData:=NIL;
  117.     END;
  118.  
  119.     WITH Gadgets[0] DO
  120.       nextGadget:=ADR(Gadgets[1]); leftEdge:=10; topEdge:=20;
  121.       width:=98; height:=10; flags:=GadgetFlagSet{}; gadgetType:=boolGadget;
  122.       activation:=ActivationFlagSet{gadgImmediate,relVerify};
  123.       gadgetRender:=ADR(Rahmen); selectRender:=NIL; gadgetText:=ADR(Texte[0]);
  124.       specialInfo:=NIL; gadgetID:=1; userData:=NIL;
  125.     END;
  126.  
  127.     WITH WDaten DO
  128.       leftEdge:=99; topEdge:=108; width:=442; height:=40; detailPen:=0;
  129.       blockPen:=1; idcmpFlags:=IDCMPFlagSet{gadgetUp}; checkMark:=NIL;
  130.       flags:=WindowFlagSet{windowDrag,windowDepth,activate}; bitMap:=NIL;
  131.       firstGadget:=ADR(Gadgets[0]); type:=ScreenFlagSet{wbenchScreen};
  132.       title:=ADR("WarnBootGen v1.0  by Holger Gzella 1989"); screen:=NIL;
  133.     END;
  134.  
  135.     WITH RD DO
  136.       leftEdge:=160; topEdge:=53; width:=320; height:=150; detailPen:=0;
  137.       blockPen:=1; idcmpFlags:=IDCMPFlagSet{gadgetUp}; checkMark:=NIL;
  138.       flags:=WindowFlagSet{windowDrag,windowDepth,activate}; bitMap:=NIL;
  139.       firstGadget:=ADR(Gadgets[4]); type:=ScreenFlagSet{wbenchScreen};
  140.       title:=ADR("INFO über WarnBootGen v1.0 ..."); screen:=NIL;
  141.     END;
  142.  
  143.     Fenster:=OpenWindow(WDaten);
  144.     Assert(Fenster#NIL,ADR("Konnte Fenster nicht öffnen."));
  145.   END SetUpStuff;
  146.  
  147. (* Das ist das assemblierte und mit Bootblock-Header versehene
  148.    WarnBoot.asm. Es wurde mit M2ACODE hier herein gepackt. *)
  149.  
  150. PROCEDURE BootBlock; (* $E- *)
  151.   BEGIN
  152.   INLINE(0444FH,05300H,0C80CH,0FE08H,00000H,00370H,00000H,0006EH);
  153.   INLINE(048E7H,0E07EH,043FAH,0008AH,04280H,02C79H,00000H,00004H);
  154.   INLINE(04EAEH,0FE68H,02C40H,0203CH,00000H,00000H,041FAH,00084H);
  155.   INLINE(0223CH,00000H,0005AH,04EAEH,0FFA6H,0224EH,02C79H,00000H);
  156.   INLINE(00004H,04EAEH,0FE62H,06600H,00022H,02C79H,00000H,00004H);
  157.   INLINE(0223CH,00002H,00004H,04EAEH,0FF28H,02C79H,00000H,00004H);
  158.   INLINE(0223CH,00002H,00004H,04EAEH,0FF3AH,04CDFH,07E07H,02C79H);
  159.   INLINE(00000H,00004H,043FAH,0001EH,04EAEH,0FFA0H,04A80H,06700H);
  160.   INLINE(0000CH,02040H,02068H,00016H,07000H,04E75H,0303CH,000FFH);
  161.   INLINE(06000H,0FFF8H,0646FH,0732EH,06C69H,06272H,06172H,07900H);
  162.   INLINE(0696EH,07475H,06974H,0696FH,06E2EH,06C69H,06272H,06172H);
  163.   INLINE(07900H,0017AH,00A48H,04F4CH,04745H,05220H,0475AH,0454CH);
  164.   INLINE(04C41H,02041H,03530H,03057H,02E00H,09300H,05014H,02A20H);
  165.   INLINE(04469H,0736BH,02069H,06E20H,04446H,0303AH,02075H,06E64H);
  166.   INLINE(02053H,07065H,06963H,06865H,07220H,0424FH,04F54H,02D56H);
  167.   INLINE(04952H,05553H,02D46H,05245H,04921H,02120H,02A00H,0EA00H);
  168.   INLINE(0641EH,04461H,07320H,05379H,07374H,0656DH,0206BH,0616EH);
  169.   INLINE(06E20H,06469H,06520H,04B6FH,06E74H,0726FH,06C6CH,06520H);
  170.   INLINE(0FC62H,06572H,06E65H,0686DH,0656EH,0202EH,02E2EH,000EBH);
  171.   INLINE(00064H,0322DH,04C49H,04E4BH,04552H,02020H,04D41H,05553H);
  172.   INLINE(04B4EH,04F50H,0462DH,03A20H,0426FH,06F74H,0766FH,07267H);
  173.   INLINE(0616EH,06720H,07765H,06974H,06572H,066FCH,06872H,0656EH);
  174.   INLINE(000E9H,00064H,03C2DH,05245H,04348H,05445H,05220H,04D41H);
  175.   INLINE(05553H,04B4EH,04F50H,0462DH,03A20H,04661H,07374H,04D65H);
  176.   INLINE(06D6FH,07279H,02061H,06273H,06368H,0616CH,07465H,06E00H);
  177.   INLINE(0E800H,05050H,06372H,06561H,07465H,06420H,06F6EH,02032H);
  178.   INLINE(0302FH,0352FH,03839H,02020H,03231H,03A34H,0393AH,03232H);
  179.   INLINE(02020H,02062H,07920H,0486FH,06C67H,06572H,02047H,07A65H);
  180.   INLINE(06C6CH,06100H,00000H,00000H,00000H,003EFH,00000H,00000H);
  181.   INLINE(00000H,003F2H,0C000H,00000H,0C001H,08000H,0C001H,08000H);
  182.   INLINE(0C007H,0E000H,0C001H,08000H,0C001H,08000H,0C000H,00000H);
  183.   INLINE(0C000H,00000H,0C180H,00300H,0C000H,00180H,0C387H,0C080H);
  184.   INLINE(0C186H,06000H,0C186H,060E7H,0C186H,061CEH,0C3C6H,0637EH);
  185.   INLINE(0C000H,00066H,0C3C3H,00066H,0C661H,08066H,0C060H,0C066H);
  186.   INLINE(0C1C0H,06066H,0C060H,0C07FH,0C661H,0807FH,0C3C3H,0007FH);
  187.   INLINE(0C000H,0007FH,0C180H,001FFH,0C3C0H,0007FH,0C3C6H,063FFH);
  188.   INLINE(0C667H,071FFH,0C7E6H,0B1FFH,0CC36H,031FFH,0CC36H,033FFH);
  189.   INLINE(0C000H,00000H,0C180H,00367H,0C000H,001CEH,0C387H,0C0FEH);
  190.   INLINE(0C186H,06006H,0C186H,06086H,0C186H,06186H,0C3C6H,06366H);
  191.   INLINE(0C000H,00007H,0C000H,0007FH,0C000H,0007FH,0C000H,0007FH);
  192.   INLINE(0C007H,0E07FH,0C000H,0007FH,0C000H,0007FH,0C000H,0007FH);
  193.   INLINE(0C000H,0007FH,0C000H,0007FH,0C000H,0007FH,0C000H,0007FH);
  194.   INLINE(0C007H,0E000H,0C000H,00067H,0C000H,0004EH,0C000H,0001CH);
  195.   INLINE(0C000H,0007EH,0C000H,0007EH,0C000H,00066H,0C000H,00066H);
  196.   INLINE(0C007H,0E067H,0C000H,00000H,0C000H,00000H,0C000H,00000H);
  197.   INLINE(0C000H,00000H,0C000H,00000H,0C000H,00000H,0C000H,00000H);
  198.   INLINE(0C007H,0E000H,0C000H,00000H,0C000H,00000H,0C000H,00000H);
  199.   INLINE(0C000H,00000H,0C000H,00067H,0C000H,0004CH,0C000H,0001CH);
  200.   INLINE(0C007H,0E00EH,0C000H,0000CH,0C000H,00010H,0C000H,0000FH);
  201.   INLINE(0C000H,00012H,0C000H,00000H,0C000H,00000H,0C000H,00000H);
  202.   INLINE(0C007H,0E000H,0C000H,00000H,0C000H,00000H,0C000H,00000H);
  203.   INLINE(0C000H,00000H,0C000H,00000H,0C000H,00000H,0C000H,00000H);
  204.   INLINE(0C007H,0E000H,0C000H,00067H,0C000H,0004FH,0C000H,0007FH);
  205.   INLINE(0C000H,0007FH,0C000H,0007FH,0C001H,0807FH,0C001H,0807FH);
  206.   INLINE(0C007H,0E07FH,0C001H,0807FH,0C001H,0807FH,0C000H,0007FH);
  207.   INLINE(0C000H,0007FH,0C3C3H,0007FH,0C661H,0807FH,0C060H,0C07FH);
  208.   INLINE(0C1C0H,0607FH,0C060H,0C07FH,0C661H,0807FH,0C3C3H,0007FH);
  209.   INLINE(0C000H,00000H,0C3C3H,00067H,0C661H,0804FH,0C060H,0C07FH);
  210.   INLINE(0C1C0H,0607FH,0C060H,0C07FH,0C661H,0807FH,0C3C3H,0007FH);
  211.   INLINE(0C000H,0007FH,0CC60H,0007FH,0CE60H,0007FH,0CF63H,0C07FH);
  212.   INLINE(0CDE6H,0607FH,0CCE6H,0607FH,0CC66H,0607FH,0CC63H,0C07FH);
  213.   INLINE(0C000H,0007FH,0C3C3H,0007FH,0C661H,0807FH,0C060H,0C07FH);
  214.   INLINE(0C1C0H,0607FH,0C060H,0C067H,0C661H,08000H,0C3C3H,00000H);
  215.   INLINE(0C000H,00000H,0CC60H,00000H,0CE60H,00000H,0CF63H,0C000H);
  216.   END BootBlock;
  217.  
  218. PROCEDURE ChipCopy(from: CardPtr; VAR to: CardPtr; size: LONGINT);
  219.  
  220. VAR ChipPtr: CardPtr;
  221.     copied : LONGINT;
  222.  
  223.   BEGIN
  224.     ChipPtr:=AllocMem(1024,MemReqSet{chip});
  225.     to:=ChipPtr;
  226.     copied:=0;
  227.     REPEAT
  228.       ChipPtr^:=from^;
  229.       INC(ChipPtr,2); INC(from,2); INC(copied,2);
  230.     UNTIL copied=size;
  231.   END ChipCopy;
  232.  
  233. PROCEDURE Motor(iostdr:IOStdReqPtr;switch:LONGCARD);
  234.   BEGIN
  235.     iostdr^.command:=motor;
  236.     iostdr^.length:=switch;
  237.     DoIO(iostdr)
  238.   END Motor;
  239.  
  240. PROCEDURE WriteBootBlock(iostdr:IOStdReqPtr;block:LONGCARD;buffer:ADDRESS);
  241.   BEGIN
  242.     iostdr^.command:=write;
  243.     iostdr^.length:=1024;
  244.     iostdr^.data:=buffer;
  245.     iostdr^.offset:=512*block;
  246.     DoIO(iostdr);
  247.     iostdr^.command:=update;
  248.     DoIO(iostdr);
  249.   END WriteBootBlock;
  250.  
  251. PROCEDURE DoIt(UnitNumber: INTEGER);
  252.   BEGIN
  253.     ChipCopy(ADR(BootBlock),buffer,1024);
  254.  
  255.     dport:=CreatePort(0,0);
  256.     Assert(dport#NIL,ADR("Konnte MsgPort nicht einrichten."));
  257.     dreq:=CreateStdIO(dport);
  258.     Assert(dreq#NIL,ADR("Konnte IO-Port nicht einrichten."));
  259.     OpenDevice(ADR("trackdisk.device"),UnitNumber,dreq,LONGSET{});
  260.  
  261.     Motor(dreq,1);
  262.     WriteBootBlock(dreq,0,buffer);
  263.     Motor(dreq,0);
  264.  
  265.     CloseDevice(dreq);
  266.   END DoIt;
  267.  
  268. PROCEDURE Info;
  269.   BEGIN
  270.     R:=OpenWindow(RD);
  271.     Assert(R#NIL,ADR("Konnte Info-Fenster nicht öffnen."));
  272.     rp:=R^.rPort;
  273.  
  274.     SetAPen(rp,3);
  275.     Move(rp,64,20);
  276.     Text(rp,ADR("*** WarnBootGen v1.0 ***"),24);
  277.     SetAPen(rp,1);
  278.     Move(rp,68,29);
  279.     Text(rp,ADR("by HOLGER GZELLA / 1989"),23);
  280.     Move(rp,52,40);
  281.     Text(rp,ADR("Installiert einen Bootblock"),27);
  282.     Move(rp,40,49);
  283.     Text(rp,ADR("wahlweise auf die Disk in DF0:"),30);
  284.     Move(rp,48,58);
  285.     Text(rp,ADR("oder DF1:. Solange der rote,"),28);
  286.     Move(rp,44,67);
  287.     Text(rp,ADR("blinkende Kasten (Alert) beim"),29);
  288.     Move(rp,32,76);
  289.     Text(rp,ADR("Booten erscheint, ist garantiert"),32);
  290.     Move(rp,24,85);
  291.     Text(rp,ADR("kein Boot-Virus auf der Startdisk."),34);
  292.     Move(rp,36,94);
  293.     Text(rp,ADR("Zusätzlich kann man durch Druck"),31);
  294.     Move(rp,48,103);
  295.     Text(rp,ADR("auf die rechte Maustaste das"),28);
  296.     Move(rp,72,112);
  297.     Text(rp,ADR("FastMemory abschalten."),22);
  298.     SetAPen(rp,3);
  299.     Move(rp,40,122);
  300.     Text(rp,ADR("WarnBootGen ist PUBLIC-DOMAIN!"),30);
  301.  
  302.     LOOP
  303.       WaitPort(R^.userPort);
  304.       Nachricht:=GetMsg(R^.userPort);
  305.       WHILE Nachricht#NIL DO
  306.         class:=Nachricht^.class;
  307.         ReplyMsg(Nachricht);
  308.         IF (gadgetUp IN class) THEN EXIT; END;
  309.       END;
  310.       Nachricht:=GetMsg(R^.userPort);
  311.     END;
  312.     CloseWindow(R);
  313.   END Info;
  314.  
  315. BEGIN
  316.   TermProcedure(CleanUp);
  317.   SetUpStuff;
  318.  
  319.   LOOP
  320.     WaitPort(Fenster^.userPort);
  321.     Nachricht:=GetMsg(Fenster^.userPort);
  322.     WHILE Nachricht#NIL DO
  323.       class:=Nachricht^.class;
  324.       WhichGad:=Nachricht^.iAddress;
  325.       ReplyMsg(Nachricht);
  326.       IF (gadgetUp IN class) THEN CASE WhichGad^.gadgetID OF
  327.                                     1: Info |
  328.                                     2: DoIt(0) |
  329.                                     3: DoIt(1) |
  330.                                     4: EXIT |
  331.                                   END;
  332.       END;
  333.       Nachricht:=GetMsg(Fenster^.userPort);
  334.     END;
  335.   END;
  336. END WarnBootGen.
  337.  
  338.  
  339.